﻿using System;
using System.Collections.Generic;
using System.Text;

namespace Working.Domínio.Produtos
{
    public class CatalogoDeProdutos: Entidade
    {
        private Dictionary<ItemID, Produto> listaDeProdutos;
        private IProdutoDataAdapter produtoDataAdapter;

        #region Construtores

        public CatalogoDeProdutos(IProdutoDataAdapter produtoDataAdapter)
        {
            this.produtoDataAdapter = produtoDataAdapter;
            this.listaDeProdutos = new Dictionary<ItemID, Produto>();
            this.Identificação = string.Empty;
        }

        public CatalogoDeProdutos(): this(null)
        { }

        #endregion


        #region Propriedades

        public string Identificação
        {
            get { return identificação; }
            set { identificação = value; }
        }
        private string identificação;

        #endregion

        #region Métodos

        protected virtual Produto ObterProdutoDaFonteDeDados(ItemID itemID)
        {
            if (produtoDataAdapter == null)
                throw new WorkingException(ProdutosResources.SFonteDeDadosInválida);

            Produto produto = produtoDataAdapter.ObterProduto(itemID);

            //Armazena produto em cache
            if (produto != null)
            {
                if (!produto.ItemID.Equals(string.Empty))
                    listaDeProdutos.Add(produto.ItemID, produto);
                else
                    throw new WorkingException(ProdutosResources.SProdutoEncontradoNãoPossuiIDVálido);
            }
                
            return produto;
        }

        public Produto ObterProduto(string itemID)
        {
            return ObterProduto(new ItemID(itemID));
        }

        public Produto ObterProduto(ItemID itemID)
        {
            if (listaDeProdutos.ContainsKey(itemID))
                return listaDeProdutos[itemID];
            else
                return ObterProdutoDaFonteDeDados(itemID);
        }

        public bool ContémProduto(string itemID)
        {
            return ContémProduto(new ItemID(itemID));
        }

        public bool ContémProduto(ItemID itemID)
        {
            return ObterProduto(itemID) != null;
        }

        #endregion


    }
}
